import json
import textwrap
import binascii
import argparse


# hx100用户传输装置解析
def hx100():
    parser = argparse.ArgumentParser()
    parser.add_argument('--data', type=str, default = None)
    args = parser.parse_args()
    json_data = json.loads(args.data)
    code = json_data['code']
    # 返回数据
    data_json = {}
    jsonParam = {}
    if '7b7b7b' in code:
        # 用传网关ID
        usePassGatewayID = code[6:16]
        # 网关类型
        communicationType = code[16:18]
        # 系统类型
        systemType = code[18:20]
        # 信息类型
        informationType = code[20:22]
        # 状态字
        statusWord = code[22:24]
        # 设备编号
        detectorCode = HexToASCII(code[24:64])
        # 位置信息（10 个汉字或 20个字母）
        locationInformation = code[64:104]
        # 时间
        time = code[104:116]
        realTime = hxTime(time)
        # 系统类型
        contentOne = getSystemType(systemType)
        # 信息类型
        contentTwo = getInformationType(informationType)
        # 报警类型
        alarmTypeName = ''
        # 报警类型
        alarmType = ''
        if informationType == '01':
            alarmTypeName = '火警'
            alarmType = '001e7548-8735-4b31-b30b-c9361a62c666'
        elif informationType == '07':
            alarmTypeName = '故障'
            alarmType = '001e7548-8735-4b31-b30b-c9361a62c656'
        else:
            alarmTypeName = '系统事件'
            alarmType = '001e7548-8735-4b31-b30b-c9361a62c654'

        contentThree = ''
        # 信息类型小于 20H 时
        if hex16To10int(informationType) < 32:
            contentThree = getDetectorType(hex16To10(statusWord))
        else:
            contentThree = getStatusWord(hex16To10(statusWord))
        # 报警内容
        content =contentOne+","+contentTwo+","+contentThree
        jsonParam = {"deviceClassify": "5","number": usePassGatewayID+detectorCode,"dataType": "alarm","alarmTime": realTime,"alarmType": alarmType,"alarmTypeName": alarmTypeName,"content": content}
        data_json['number'] = usePassGatewayID+detectorCode
        data_json['time'] = time
        data_json['alarm'] = jsonParam
    elif '7a7a' in code:
        # 用传网关ID
        usePassGatewayID = code[4:14]
        # 时间
        time = code[14:26]
        realTime = hxTime(time)
        jsonArray = [{"name":"今日数据变化","value":0}]
        jsonParam = {"deviceClassify": "5","number": usePassGatewayID,"type": "autoNetwork","time": realTime,"paramInfo": jsonArray,"dataType": "normal"}
        data_json['number'] = usePassGatewayID
        data_json['time'] = time
        data_json['normal'] = jsonParam
    return data_json
def hxTime(time):
    year = hex16To10(time[0:2])
    month = hex16To10(time[2:4])
    if len(month) ==1:
        month = '0'+month
    day = hex16To10(time[4:6])
    if len(day) ==1:
        day = '0'+day
    hour = hex16To10(time[6:8])
    if len(hour) ==1:
        hour = '0'+hour
    minute = hex16To10(time[8:10])
    if len(minute) ==1:
        minute = '0'+minute
    second = hex16To10(time[10:12])
    if len(second) ==1:
        second = '0'+second
    realTime ='20'+year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second
    return realTime
# 十六进制转ASCII码
def HexToASCII(hex):
    # hex每两位截取
    hex = textwrap.fill(hex, width=2)
    # 分割
    list = hex.split()
    returns = ''
    for cd in list:
        if cd != '00':
            # 十六进制转ASCII码
            data = binascii.a2b_hex(cd)
            data = data.decode(encoding ='utf-8',errors = 'strict')
            returns = returns+data
    return returns

# 十六进制转十进制返回string
def hex16To10(code):
    To10code = int(code,16)
    To10codeStr = str(To10code)
    return To10codeStr
# 十六进制转十进制返回int
def hex16To10int(code):
    To10code = int(code,16)
    return To10code
# 系统类型
def getSystemType(systemTypeCode):
    systemType = {
        '01' : '火灾自动报警系统',
        '02' : '自动喷水灭火系统',
        '03' : '消火栓系统',
        '04' : '电气火灾监控系统',
        '05' : '可燃气体探测系统',
        '06' : '防火门监控系统',
        '07' : '电源监控系统',
        '08' : '智慧电力',
        '09' : '智慧农业',
        '0a' : '预留'
    }
    return systemType.get(systemTypeCode)
# 信息类型
def getInformationType(informationTypeCode):
    informationType = {
        '00' : '正常',
        '01' : '火警',
        '02' : '监管',
        '03' : '启动',
        '04' : '反馈',
        '05' : '隔离（屏蔽）',
        '06' : '取消隔离（取消屏蔽）',
        '07' : '故障',
        '08' : '故障恢复（消除）',
        '09' : '动作',
        '0A' : '停止',
        '0B' : '预警',
        '0C' : '预警恢复',
        '0D' : '报警',
        '0E' : '报警恢复',
        '0F' : '停动',
        '10' : '离线',
        '11' : '离线恢复',
        '12' : '测试',
        '13' : '结束测试',
        '14' : '报脏',
        '15' : '反馈恢复',
        '16' : '设备自检',
        '17' : '预留',
        '18' : '预留',
        '19' : '预留',
        '20' : '消防主机状态'
    }
    return informationType.get(informationTypeCode)
def getStatusWord(statusWordCode):
    if len(statusWordCode) ==1 :
        statusWordCode = '0' + statusWordCode
    statusWord = {
        '01' : '复位',
        '02' : '主电故障',
        '03' : '主电恢复',
        '04' : '备电故障',
        '05' : '备电恢复',
        '06' : '手动允许',
        '07' : '自动允许',
        '08' : '喷洒允许',
        '09' : '本次开机',
        '0A' : '上次关机',
        '0B' : '自检',
        '0C' : '全关',
        '0D' : '直控禁止',
        '0E' : '直控允许',
        '0F' : '手动禁止',
        '10' : '自动禁止',
        '11' : '喷洒禁止',
        '12' : '总线故障',
        '13' : '延时',
        '14' : '延时状态',
        '15' : '延时结束',
        '16' : '自检结束',
        '17' : '全开',
        '18' : '消音',
        '19' : '全部自动',
        '20' : '部分自动',
        '21' : '模拟联动',
        '22' : '监控状态',
        '23' : '调试状态',
        '24' : '用户登录'
    }
    return statusWord.get(statusWordCode)
# 探测器类型
def getDetectorType(detectorTypeCode):
    if len(detectorTypeCode) ==1 :
        detectorTypeCode = '0' + detectorTypeCode
    detectorType = {
        '00' : '定义',
        '04' : '警接口',
        '08' : '式感温',
        '12' : '防广播',
        '16' : '火栓泵',
        '20' : '风机',
        '24' : '风阀',
        '28' : '火门',
        '32' : '调机组',
        '36' : '幕电磁',
        '40' : '灾示盘',
        '44' : '防电源',
        '48' : '盗模块',
        '52' : '号灯',
        '56' : '停按钮',
        '60' : '压机',
        '64' : '淋阀',
        '68' : '控允许',
        '72' : '用工作',
        '76' : '定义',
        '80' : '定义',
        '84' : '气火警',
        '88' : '定义',
        '92' : '定义',
        '96' : '定义',
        '100' : '湿式报警阀',
        '01' : '离子感烟',
        '05' : '可燃气体',
        '09' : '模拟感温',
        '13' : '讯响器',
        '17' : '喷淋泵',
        '21' : '新风机',
        '25' : '电磁阀',
        '29' : '压力开关',
        '33' : '柴油发电',
        '37' : '气体启动',
        '41' : '闸阀',
        '45' : '紧急照明',
        '49' : '信号碟阀',
        '53' : '设备停动',
        '57' : '雨淋泵',
        '61' : '联动电源',
        '65' : '感温棒',
        '69' : '外控禁止',
        '73' : '内部设备',
        '77' : '未定义',
        '81' : '消火栓',
        '85' : '吸气预警',
        '89' : '未定义',
        '93' : '未定义',
        '97' : '交流电源',
        '101' : '"疏散门',
        '02' : '点型感温',
        '06' : '红外对射',
        '10' : '复合探测',
        '14' : '消防电话',
        '18' : '稳压泵',
        '22' : '防火阀',
        '26' : '卷帘门中',
        '30' : '水流指示',
        '34' : '照明配电',
        '38' : '气体停动',
        '42' : '高位水箱',
        '46' : '疏导指示',
        '50' : '防排烟阀',
        '54' : '泵故障',
        '58' : '上位机',
        '62' : '多线盘锁',
        '66' : '故障输出',
        '70' : '备用指示',
        '74' : '紧急求助',
        '78' : '干粉灭火',
        '82' : '缆式感温',
        '86' : '未定义',
        '90' : '总线',
        '94' : '接地故障',
        '98' : '备用电源',
        '102' : '水位',
        '03' : '点型感烟',
        '07' : '紫外感光',
        '11' : '手动按钮',
        '15' : '消火栓',
        '19' : '排烟机',
        '23' : '排烟阀',
        '27' : '卷帘门下',
        '31' : '电梯',
        '35' : '动力配电',
        '39' : '从机',
        '43' : '泡沫泵',
        '47' : '喷洒指示',
        '51' : '水幕泵',
        '55' : '急启按钮',
        '59' : '回路',
        '63' : '部分设备',
        '67' : '环路开关',
        '71' : '门灯',
        '75' : '未定义',
        '79' : '未定义',
        '83' : '吸气感烟',
        '87' : '未定义',
        '91' : '未定义',
        '95' : '联动公式',
        '99' : '键盘'
    }
    return detectorType.get(detectorTypeCode)



if __name__ == '__main__':
    print(hx100())
